/**
 * demo9. interface demo
 *
 * @author 90598
 * @date 2020/11/10
 */
package main

import "fmt"

type Animaler interface {
	SetName(name string)
	GetName() string
}

type Dog struct {
	name string
}

type Cat struct {
	name string
}

func (dog Dog) SetName(name string) {
	dog.name = name
}

func (dog Dog) GetName() string {
	return dog.name
}

func (cat *Cat) SetName(name string) {
	cat.name = name
}

func (cat Cat) GetName() string {
	return cat.name
}

func main() {
	var animal Animaler

	cat := &Cat{
		name: "喵喵",
	}
	animal = cat
	fmt.Println(animal.GetName()) // 喵喵
	cat.SetName("猫猫")             // animal.SetName("猫猫")
	fmt.Println(animal.GetName()) // 猫猫
	fmt.Println(cat.GetName())    // 猫猫

	dog := /*&*/ Dog{name: "汪汪"}
	animal = dog
	fmt.Println(animal.GetName()) // 汪汪
	animal.SetName("狗狗")
	fmt.Println(animal.GetName()) // 汪汪
	fmt.Println(dog.GetName())    // 汪汪
	dog.SetName("狗狗")
	fmt.Println(animal.GetName()) // 汪汪
	fmt.Println(dog.GetName())    // 汪汪

}
